CASE WHEN ... THEN ... END в SQLОператор CASE в SQL позволяет реализовать условную логику прямо внутри запроса. С его помощью можно назначать категории, подставлять текстовые метки, фильтровать данные по сложным условиям и управлять порядком сортировки. Это один из самых полезных инструментов, когда нужно сделать запрос «умнее», не вынося логику в код приложения.
В этом уроке разберем:
CASE;SELECT;CASE в WHERE;CASE в ORDER BY.CASECASE бывает в двух основных формах.
simple CASE)CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
ELSE default_result
END
Эта форма сравнивает одно выражение (expression) с разными значениями.
searched CASE)CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result
END
Здесь в каждом WHEN указывается полноценное условие. Эта форма более гибкая и используется чаще.
Важно:
WHEN;ELSE;ELSE не указан, возвращается NULL.CASE в SELECTСамый популярный сценарий — добавить вычисляемый столбец с категорией или меткой.
SELECT
payment_id,
amount,
CASE
WHEN amount < 2 THEN 'Низкий платеж'
WHEN amount BETWEEN 2 AND 6 THEN 'Средний платеж'
ELSE 'Высокий платеж'
END AS payment_level
FROM payment
LIMIT 10;
Что делает запрос:
payment оценивает значение amount;payment_level.SELECT
rental_id,
rental_date,
return_date,
CASE
WHEN return_date IS NULL THEN 'Не возвращено'
ELSE 'Возвращено'
END AS rental_status
FROM rental
LIMIT 10;
Такой подход удобен для отчетов и дашбордов, где сырые значения нужно превратить в понятные статусы.
CASE в WHEREХотя чаще CASE используют в SELECT, он также может участвовать в фильтрации. Обычно это полезно, когда условие зависит от другой колонки или от параметра логики.
SELECT
payment_id,
staff_id,
amount
FROM payment
WHERE amount >= CASE
WHEN staff_id = 1 THEN 5
WHEN staff_id = 2 THEN 3
ELSE 4
END;
Логика фильтра:
staff_id = 1 отбираются платежи с amount >= 5;staff_id = 2 — с amount >= 3;amount >= 4.Для простых случаев условие через OR часто читается легче. Но CASE в WHERE полезен, когда правило фильтрации действительно ветвится и должно оставаться в одном выражении.
CASE в ORDER BYОчень частая задача — сортировать не по алфавиту или числу, а по бизнес-приоритету. CASE отлично решает это.
SELECT
title,
rating
FROM film
ORDER BY CASE rating
WHEN 'G' THEN 1
WHEN 'PG' THEN 2
WHEN 'PG-13' THEN 3
WHEN 'R' THEN 4
WHEN 'NC-17' THEN 5
ELSE 6
END,
title;
Результат: сначала идут фильмы с более «мягким» рейтингом, затем с более строгим, независимо от стандартной сортировки строк.
SELECT
rental_id,
rental_date,
return_date
FROM rental
ORDER BY CASE
WHEN return_date IS NULL THEN 0
ELSE 1
END,
rental_date DESC
LIMIT 20;
Так можно выводить самые важные записи в начало результата.
Сегментация клиентов по тратам:
SELECT
customer_id,
SUM(amount) AS total_spent,
CASE
WHEN SUM(amount) < 50 THEN 'Базовый'
WHEN SUM(amount) < 100 THEN 'Активный'
ELSE 'VIP'
END AS customer_segment
FROM payment
GROUP BY customer_id;
Подсчет количества записей по условным группам:
SELECT
SUM(CASE WHEN amount < 2 THEN 1 ELSE 0 END) AS low_count,
SUM(CASE WHEN amount BETWEEN 2 AND 6 THEN 1 ELSE 0 END) AS medium_count,
SUM(CASE WHEN amount > 6 THEN 1 ELSE 0 END) AS high_count
FROM payment;
Кастомный приоритет для отчета:
SELECT
title,
replacement_cost
FROM film
ORDER BY CASE
WHEN replacement_cost >= 25 THEN 1
WHEN replacement_cost >= 20 THEN 2
ELSE 3
END,
replacement_cost DESC;
CASE WHEN ... THEN ... END — универсальный инструмент условной логики в SQL.
Ключевые идеи:
SELECT он помогает строить категории и статусы;WHERE позволяет задавать ветвящуюся фильтрацию;ORDER BY дает полный контроль над пользовательским порядком сортировки;ELSE, чтобы избежать неожиданных NULL.Освоив CASE, вы сможете делать запросы гибче, понятнее и ближе к бизнес-логике прямо на уровне SQL.